﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpModelInterface.h"
#include "IDbObject.h"

namespace gcmp
{
    class IElement;
    class IDocument;
    class IElementParentReporter;
    

    /// \brief 编辑模式行为扩展类
    class GCMP_MODEL_INTERFACE_EXPORT IEditModeBehavior : public IDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IEditModeBehavior, gcmp::IDbObject)

    public:
        /// \brief 析构函数
        virtual ~IEditModeBehavior() {}
        /// \brief 获取编辑模式类型，不同的EditMode不能重复
        /// \return 编辑模式类型
        virtual std::wstring GetEditModeType() const = 0;
        /// \brief 判断对象在编辑模式中是否可编辑，不可编辑的物体会灰显，且不能被选中
        /// \param pElement 查询的对象
        /// \return true-可编辑；false-不可编辑
        virtual bool IsElementEditable(const IElement* pElement) const = 0;
        /// \brief 判断编辑状态下永远显示对象
        /// \param pElement 查询的对象
        /// \return true-永远显示对象；false-不永远显示对象
        virtual bool IsNotAffectedByViewRange(const IElement* pElement) const = 0;

    public:
        /// \brief 进入编辑模式
        /// \param pDoc 文档指针
        /// \param isCreating 是否是创建过程，比如创建楼板还是编辑楼板
        /// \return true-成功；false-失败
        virtual bool StartEditing(IDocument* pDoc, bool isCreating) = 0;
        /// \brief 退出编辑模式
        /// \param pDoc 文档指针
        /// \param editingElementId 编辑的对象
        /// \return true-成功；false-失败
        virtual bool EndEditing(IDocument* pDoc) = 0;

    public:
        /// \brief 报告依赖的ElementIds。对象删除和关联更新依赖于这个接口的正确实现。
        /// \param pDoc 文档指针
        /// \param reporter 报告接口
        /// \return void
        /// \see IElement::ReportParents
        virtual void ReportParents(IDocument* pDoc, IElementParentReporter& reporter) const = 0;
        /// \brief 当弱依赖的Element被删除后，此接口会被调用。
        /// \param pDoc 文档指针
        /// \param deleteElementIds 表示将被删除的Element ids
        /// \return void
        /// \see IElement::UpdateForWeakParentDeletion
        virtual void UpdateForWeakParentDeletion(IDocument* pDoc, const std::set<ElementId>& deletedElementIds) = 0;
    };
}





